﻿package com.main
{
	import flash.utils.Proxy;
	import flash.utils.flash_proxy;
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Decorator ::
	// - cette classe implémente le design pattern Decorator
	// - permet de multi-typer des objets
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public dynamic class Decorator extends Proxy
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private var decorateInstance:Object;
		
		private var _decorateName : String;
		private var _decorateType : String;
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function Decorator( decorateObj : Object )
		{
			decorateInstance 	= decorateObj;
			decorateName 		= decorateInstance.skinName;
			decorateType		= decorateInstance.skinType;
		}
		
		flash_proxy override function callProperty( name : *, ...rest ) : *
		{
			if( decorateInstance[name] )
			{
				decorateInstance[name].apply( decorateInstance, rest );
			}
			else
			{
				trace(name+" method does not exist!");
			}
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// GETTER & SETTER
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function get decorateName():String
		{
			return _decorateName;
		}
		
		public function get decorateName( pName : String ) : void
		{
			_decorateName = pName;
		}
		
		public function get decorateType():String
		{
			return _decorateType;
		}
		
		public function get decorateName( pType : String ) : void
		{
			_decorateType = pType;
		}
		
		/* si on veut pouvoir vérifier qu'il n'y ai pas de doublons dans les SkinTO -> cf livre */
	}
}